package com.kexio.user.entity;

import java.util.List;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.kexio.common.entity.BaseEntity;

/**
 * 权限实体类
 * 
 * 对应数据库表 sys_permission
 * 存储系统权限信息，用于精细化权限控制
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
@TableName("sys_permission")
public class Permission extends BaseEntity {
    
    /**
     * 权限ID（主键）
     */
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
    
    /**
     * 权限编码（在租户内唯一，如：system:user:list）
     */
    @TableField("code")
    private String code;
    
    /**
     * 权限名称
     */
    @TableField("name")
    private String name;
    
    /**
     * 权限类型：OP-操作权限，RESOURCE-资源权限，API-接口权限
     */
    @TableField("type")
    private String type;
    
    /**
     * 权限描述
     */
    @TableField("description")
    private String description;
    
    /**
     * 所属菜单ID（权限直接归属的菜单）
     */
    @TableField("menu_id")
    private String menuId;
    
    /**
     * 父权限ID（用于权限层级）
     */
    @TableField("parent_id")
    private String parentId;
    
    /**
     * 权限路径（层级路径，如：/system/user）
     */
    @TableField("path")
    private String path;
    
    /**
     * 状态：1-启用，0-禁用
     */
    @TableField("status")
    private Integer status;
    
    /**
     * 排序号
     */
    @TableField("order_no")
    private Integer orderNo;
    
    
    // ==================== 非数据库字段（用于关联查询） ====================
    
    /**
     * 子权限列表（非数据库字段）
     */
    @TableField(exist = false)
    private List<Permission> children;
    
    
    // ==================== 便捷方法 ====================
    
    /**
     * 判断权限是否启用
     */
    public boolean isEnabled() {
        return status != null && status == 1;
    }
    
    /**
     * 判断是否为操作权限
     */
    public boolean isOperationPermission() {
        return "OP".equals(this.type);
    }
    
    /**
     * 判断是否为资源权限
     */
    public boolean isResourcePermission() {
        return "RESOURCE".equals(this.type);
    }
    
    /**
     * 判断是否为接口权限
     */
    public boolean isApiPermission() {
        return "API".equals(this.type);
    }
    
    /**
     * 判断是否为根权限
     */
    public boolean isRootPermission() {
        return parentId == null || "0".equals(parentId);
    }
    
    /**
     * 判断权限码是否匹配（支持通配符）
     */
    public boolean matches(String permissionCode) {
        if (permissionCode == null || this.code == null) {
            return false;
        }
        
        // 精确匹配
        if (this.code.equals(permissionCode)) {
            return true;
        }
        
        // 通配符匹配（如：system:user:* 匹配 system:user:list）
        if (this.code.endsWith("*")) {
            String prefix = this.code.substring(0, this.code.length() - 1);
            return permissionCode.startsWith(prefix);
        }
        
        return false;
    }
    
    // ==================== Getter/Setter ====================
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getCode() {
        return code;
    }
    
    public void setCode(String code) {
        this.code = code;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getType() {
        return type;
    }
    
    public void setType(String type) {
        this.type = type;
    }
    
    public String getDescription() {
        return description;
    }
    
    public void setDescription(String description) {
        this.description = description;
    }
    
    public String getMenuId() {
        return menuId;
    }
    
    public void setMenuId(String menuId) {
        this.menuId = menuId;
    }
    
    public String getParentId() {
        return parentId;
    }
    
    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
    
    public String getPath() {
        return path;
    }
    
    public void setPath(String path) {
        this.path = path;
    }
    
    public Integer getStatus() {
        return status;
    }
    
    public void setStatus(Integer status) {
        this.status = status;
    }
    
    public Integer getOrderNo() {
        return orderNo;
    }
    
    public void setOrderNo(Integer orderNo) {
        this.orderNo = orderNo;
    }
    
    
    public List<Permission> getChildren() {
        return children;
    }
    
    public void setChildren(List<Permission> children) {
        this.children = children;
    }
    
    
    @Override
    public String toString() {
        return "Permission{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", description='" + description + '\'' +
                ", parentId='" + parentId + '\'' +
                ", path='" + path + '\'' +
                ", status=" + status +
                ", orderNo=" + orderNo +
                '}';
    }
}
